from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from manage_worker import models
from manage_worker.utills.bootsrtap import BootStrapModelForm


class UserModelForm(BootStrapModelForm):
    # 验证name长度最小为3
    name = forms.CharField(min_length=2, label='姓名')
    class Meta:
        model = models.UserInfo
        fields = ['name', 'password', 'age', 'account', 'creat_time', 'gender', 'depart']


class PrettyNumModelForm(BootStrapModelForm):
    '''
    靓号类
    '''

    # 验证方式1
    mobile = forms.CharField(
        label='手机号',
        validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')]
    )

    class Meta:
        model = models.PrettyNum
        # 展示所有字段
        # fields = '__all__'
        # 展示卸载列表中得字段
        fields = ['id', 'mobile', 'price', 'level', 'status']
        # 展示除了列表中得字段
        # exclude = ['level']



    # 第二种验证方法，钩子函数，必须时clean_字段名
    def clean_mobile(self):
        text_mobile = self.cleaned_data['mobile']
        if len(text_mobile) != 11:
            raise ValidationError('格式错误')
        # 判断表里是否有此数据，看列表得长度
        # elif models.PrettyNum.objects.filter(mobile=text_mobile).count() > 0:
        # 另一种方法，django自带得方法，是否存在.exists()
        elif models.PrettyNum.objects.filter(mobile=text_mobile).exists():
            raise ValidationError('表中已经存在此号码')
        return text_mobile


class PrettyEditNumModelForm(BootStrapModelForm):
    '''
    编辑靓号单独创建得类，主要功能是展示手机号，但是不让修改
    '''

    # 验证方式1
    mobile = forms.CharField(
        label='手机号',
        # 加上disabled=True表示不可修改
        disabled=True
    )

    class Meta:
        model = models.PrettyNum
        # 展示所有字段
        # fields = '__all__'
        # 展示卸载列表中得字段
        fields = ['id', 'mobile', 'price', 'level', 'status']
        # 展示除了列表中得字段
        # exclude = ['level']


    # 第二种验证方法，钩子函数，必须时clean_字段名
    def clean_mobile(self):
        text_mobile = self.cleaned_data['mobile']
        if len(text_mobile) != 11:
            raise ValidationError('格式错误')
        # 修改时不能跟新增时判断逻辑一样，因为如果修改时不修改号码，再去表里查，那么此手机号是肯定存在得
        # 可以排除掉当前修改那一条数据得id，self.instance.pk表示当前行得id|  exclude不包括
        elif models.PrettyNum.objects.filter(mobile=text_mobile).exclude(id=self.instance.pk).exists():
            raise ValidationError('表中已经存在此号码')
        return text_mobile
